const express = require('express');
const router = express.Router();
const { Op } = require('sequelize');
const { userModel, getCreateDefaults, getUpdateDefaults } = require('../../models/user.js');
const { tokenModel, getCreateDefaults: getTokenCreateDefaults, getUpdateDefaults: getTokenUpdateDefaults } = require('../../models/token.js');
const wechatAPI = require('../../library/wechat.js');
const userValidation = require('../../middleware/validation');
const { createSuccessResponse } = require('../../middleware/responseHandler.js');
const crypto = require('crypto');

// ==================== 用户信息接口 ====================
/**
 * 本页面主要方法有：
 * 1.微信小程序用户登录
 * 2.微信小程序获取用户信息
 * 3.微信小程序修改用户信息
 */
// ==================== 工具方法 ====================

// 工具方法：生成随机token
function generateToken() {
    return crypto.randomBytes(32).toString('hex');
}

// 工具方法：获取token过期时间戳
function getExpireTime(hours = 1) {
    const now = Math.floor(Date.now() / 1000);
    return now + (hours * 3600);
}

// 工具方法：创建token
async function createToken(userId, tokenIp = '', hours = 1) {
    if (!userId) {
        const error = new Error('用户ID不能为空');
        error.name = 'ValidationError';
        throw error;
    }

    const tokenValue = generateToken();
    const expireTime = getExpireTime(hours);

    // 先使该用户的其他token失效
    await tokenModel.update(
        { is_delete: 1, ...getTokenUpdateDefaults() },
        {
            where: {
                user_id: userId,
                is_delete: 0
            }
        }
    );

    // 创建新token
    const newToken = await tokenModel.create({
        user_id: userId,
        token: tokenValue,
        token_ip: tokenIp,
        expire_time: expireTime,
        ...getTokenCreateDefaults()
    });

    return {
        token: tokenValue,
        expire_time: expireTime,
        token_id: newToken.token_id
    };
}

// ==================== 路由定义 ====================

// 微信小程序登录
/**
 * 微信小程序登录
 * @param {string} code 微信小程序登录code
 * @returns {Promise<object>} 返回用户信息
 * 逻辑:
 * 1.根据code获取微信用户信息
 * 2.根据微信用户信息查询数据库用户
 * 3.如果数据库用户不存在,则创建新用户
 * 4.如果数据库用户存在,则更新用户信息
 * 5.生成token
 * 6.返回token及用户信息
 */
router.post("/wechatLogin", (req, res, next) => {
    const { code } = req.body;

    // 参数验证
    if (!code) {
        return res.status(400).json({
            success: false,
            message: '微信登录code不能为空'
        });
    }

    // 1.根据code获取微信用户信息
    wechatAPI.code2Session(code)
        .then(session => {
            if (!session.openid) {
                return Promise.reject(new Error('获取微信用户信息失败'));
            }
            return session;
        })
        .then(session => {
            // 2.根据微信用户信息查询数据库用户
            return userModel.findOne({
                where: {
                    openid: session.openid,
                    is_delete: 0
                }
            }).then(user => ({ session, user }));
        })
        .then(({ session, user }) => {
            // 3.如果数据库用户不存在,则创建新用户
            if (!user) {
                return userModel.create({
                    openid: session.openid,
                    unionid: session.unionid || null,
                    session_key: session.session_key,
                    nickname: '微信用户',
                    avatar: '',
                    ...getCreateDefaults()
                });
            } else {
                // 4.如果数据库用户存在,则更新用户信息
                return user.update({
                    session_key: session.session_key,
                    unionid: session.unionid || user.unionid,
                    ...getUpdateDefaults()
                }).then(() => user);
            }
        })
        .then(user => {
            // 5.生成token
            return createToken(user.user_id, req.ip, 24).then(tokenInfo => ({ user, tokenInfo }));
        })
        .then(({ user, tokenInfo }) => {
            // 6.返回token及用户信息
            res.json(createSuccessResponse({
                token: tokenInfo.token,
                expire_time: tokenInfo.expire_time,
                user: {
                    user_id: user.user_id,
                    openid: user.openid,
                    nickname: user.nickname,
                    avatar: user.avatar,
                    created_at: user.created_at,
                    updated_at: user.updated_at
                }
            }, '登录成功'));
        })
        .catch(error => {
            console.error('微信登录错误:', error);
            next(error);
        });
});


module.exports = router;